export const DateUtil = {
    // 时间选择器开始时间
    getPickerStartDate() {
        return new Date(2000, 0, 1);
    },

    // 时间选择器结束时间
    getPickerEndDate() {
        const now = new Date();
        return new Date(now.getFullYear() + 10, 0, 1);
    },

    // 获取月份间隔
    diffrenceInMonth(startDate, endDate) {
        return (endDate.getFullYear() * 12 + endDate.getMonth()) -
            (startDate.getFullYear() * 12 + startDate.getMonth());
    },

    // 月份累加, 返回值日为1
    addMonth(startDate, month) {
        const totalMonths = startDate.getFullYear() * 12 + startDate.getMonth() + month;
        const year = Math.floor(totalMonths / 12);
        const monthIndex = totalMonths % 12;
        return new Date(year, monthIndex, 1);
    },

    // 获取日期时间（yyyy-MM-dd HH:mm）
    getDateTimeTitle(datetime) {
        const date = this.getDayTitle(datetime, '-');
        const hour = String(datetime.getHours()).padStart(2, '0');
        const minute = String(datetime.getMinutes()).padStart(2, '0');
        return `${date} ${hour}:${minute}`;
    },

    // 获取日期时分秒（yyyy-MM-dd HH:mm:ss）
    getFullDateTime(datetime) {
        return this.formatDate(datetime, 'yyyy-MM-dd HH:mm:ss');
    },

    // 获取以日期为文件名内容（yyyy-MM-dd-HH-mm-ss）
    getDateStringForFileName(dateTime = new Date()) {
        return this.formatDate(dateTime, 'yyyy-MM-dd-HH-mm-ss');
    },

    // 获取时间（HH:mm）
    getTimeTitle(dateTime) {
        if (!dateTime) return '--:--';
        const hour = String(dateTime.getHours()).padStart(2, '0');
        const minute = String(dateTime.getMinutes()).padStart(2, '0');
        return `${hour}:${minute}`;
    },

    // 获取日期（yyyy-MM-dd）
    getDayTitle(dateTime, divider = '-', nullStr = '--') {
        if (!dateTime) return nullStr;
        const year = dateTime.getFullYear();
        const month = String(dateTime.getMonth() + 1).padStart(2, '0');
        const day = String(dateTime.getDate()).padStart(2, '0');
        return `${year}${divider}${month}${divider}${day}`;
    },

    // 获取周起始日期（需要提供 firstDayOfWeekIndex，如 0 表示周日开始）
    getWeekStartDate(dateTime, firstDayOfWeekIndex = 1) {
        const day = dateTime.getDay(); // 0: 周日, 1: 周一, ..., 6: 周六
        const diff = (day - firstDayOfWeekIndex + 7) % 7;
        const startDate = new Date(dateTime);
        startDate.setDate(dateTime.getDate() - diff);
        return startDate;
    },

    // 获取周结束日期（firstDayOfWeekIndex 同上）
    getWeekEndDate(dateTime, firstDayOfWeekIndex = 1) {
        const startDate = this.getWeekStartDate(dateTime, firstDayOfWeekIndex);
        const endDate = new Date(startDate);
        endDate.setDate(startDate.getDate() + 6);
        return endDate;
    },

    // 获取周标题
    getWeekTitle(dateTime, firstDayOfWeekIndex = 1) {
        const startDate = this.getWeekStartDate(dateTime, firstDayOfWeekIndex);
        const endDate = new Date(startDate);
        endDate.setDate(startDate.getDate() + 6);
        return `${this.getDayTitle(startDate)}-${this.getDayTitle(endDate)}`;
    },

    // 获取月份标题（yyyy/MM）
    getMonthTitle(dateTime) {
        const year = String(dateTime.getFullYear());
        const month = String(dateTime.getMonth() + 1).padStart(2, '0');
        return `${year}/${month}`;
    },

    // 获取年份标题
    getYearTitle(dateTime) {
        return String(dateTime.getFullYear());
    },

    // 获取日期（去除时分秒）
    getDate(dateTime) {
        return new Date(dateTime.getFullYear(), dateTime.getMonth(), dateTime.getDate());
    },

    // 当前日期（不含时分秒）
    nowOnlyDate() {
        return this.getDate(new Date());
    },

    // convert to date
    strToDate(timeStr){
        // 注意时间可能是 2025-07-09 02:00 需要进行判断，并且补足
        if (timeStr.length === 10) {
            timeStr += ' 00:00:00';
        }
        else if (timeStr.length === 16) {
            timeStr += ':00';
        }
        return new Date(timeStr);
    },

    // 通用格式化函数
    formatDate(date, format) {
        const map = {
            'yyyy': date.getFullYear(),
            'MM': String(date.getMonth() + 1).padStart(2, '0'),
            'dd': String(date.getDate()).padStart(2, '0'),
            'HH': String(date.getHours()).padStart(2, '0'),
            'mm': String(date.getMinutes()).padStart(2, '0'),
            'ss': String(date.getSeconds()).padStart(2, '0')
        };
        return format.replace(/yyyy|MM|dd|HH|mm|ss/g, match => map[match]);
    }
};
